/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package BaseDatos;

import BaseDatos.GeneradorMySQL.AlumnosMySQL;
import Controladores.GestorMensajes;
import Modelo.Alumno;
import com.mysql.jdbc.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 *
 * @author Marko
 */
public class GestorAlumnosBD{

////////////////////////////////////////////////////////////////////////////////
// Constructores
////////////////////////////////////////////////////////////////////////////////

    /**
     * Constructor por defecto de la clase
     */
    public GestorAlumnosBD() {
        iniciarComponentes();
    }

////////////////////////////////////////////////////////////////////////////////
// Interfaz de la clase
////////////////////////////////////////////////////////////////////////////////

    /**
     * busca a un alumno en particular en la base de datos
     * @param _matricula
     * @return Devuelve el alumno encontrado con la matricula especificada
     */
    public Alumno buscarAlumno(String _matricula){
        iniciarConexionBD();
        return buscarAlumnoBD(_matricula);
    }
    
    /**
     * realiza la consulta de un alumno en la base de datos
     * @param _matricula
     * @return los datos del alumno encontrado
     */
    public ArrayList<Alumno> buscarAlumnos(String _matricula){
        iniciarConexionBD();
        return buscarAlumnosBD(_matricula);
    }
    
    /**
     * administra el registro para le alumno
     * @param _nuevoAlumno 
     */
    public void registrar(Alumno _nuevoAlumno){
        iniciarConexionBD();
        registrarAlumnoBD(_nuevoAlumno);
    }
    
    /**
     * administra la modificacion del alumno en la base de datos
     * @param _alumno 
     */
    public void actualizar(Alumno _alumno){
        iniciarConexionBD();
        actualizarAlumno(_alumno);
    }
    
////////////////////////////////////////////////////////////////////////////////
// Metodos Privados
////////////////////////////////////////////////////////////////////////////////
    
    /**
     * busca a un alumno en particular en la base de datos
     * @param _matricula
     * @return Devuelve el alumno encontrado con la matricula especificada
     */
    private Alumno buscarAlumnoBD(String _matricula){
        Alumno alumnoEncontrado = null;
        AlumnosMySQL alumnosMySQL = new AlumnosMySQL();
        String instruccionMySQL = alumnosMySQL.consultaParticular(_matricula);
        try {
            ResultSet resultadoDeConsulta;
            resultadoDeConsulta = constructorInstruccionesMySQL.executeQuery(instruccionMySQL);
            while(resultadoDeConsulta.next()){
                alumnoEncontrado = new Alumno();
                String nombre = resultadoDeConsulta.getString("Nombre");
                alumnoEncontrado.establecerNombre(nombre);
                
                String telefono = resultadoDeConsulta.getString("Telefono");
                alumnoEncontrado.establecerTelefono(telefono);
                
                String direccion = resultadoDeConsulta.getString("Direccion");
                alumnoEncontrado.establecerDireccion(direccion);
                
                
                String matricula = resultadoDeConsulta.getString("Matricula");
                alumnoEncontrado.establecerMatricula(matricula);
                
                String semestre = resultadoDeConsulta.getString("Semestre");
                alumnoEncontrado.establecerSemestre(semestre);
                
                String correo = resultadoDeConsulta.getString("Correo");
                alumnoEncontrado.establecerCorreo(correo);
                
                String licenciatura = resultadoDeConsulta.getString("Licenciatura");
                alumnoEncontrado.establecerLicenciatura(licenciatura);
                
            }
        } catch (SQLException log) {
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(log, "alumno");
        } finally{
            terminarConexionBD();
        }
        return alumnoEncontrado;
    }
    
    /**
     * Busca a los alumnos que coincidan con los datos
     * @param _instruccionMySQL
     * @throws SQLException 
     */
    private ArrayList<Alumno> buscarAlumnosBD(String _matricula){
        AlumnosMySQL alumnosMySQL = new AlumnosMySQL();
        String instruccionMySQL = alumnosMySQL.consultaGeneral(_matricula);
        ArrayList<Alumno> alumnosEncontrados = new ArrayList<>();
        try {
            ResultSet resultadoDeConsulta;
            resultadoDeConsulta = constructorInstruccionesMySQL.executeQuery(instruccionMySQL);
            
            while(resultadoDeConsulta.next()){
                Alumno alumnoEncontrado = new Alumno();
                String nombre = resultadoDeConsulta.getString("Nombre");
                alumnoEncontrado.establecerNombre(nombre);
                
                String telefono = resultadoDeConsulta.getString("Telefono");
                alumnoEncontrado.establecerTelefono(telefono);
                
                String direccion = resultadoDeConsulta.getString("Direccion");
                alumnoEncontrado.establecerDireccion(direccion);
                
                
                String matricula = resultadoDeConsulta.getString("Matricula");
                alumnoEncontrado.establecerMatricula(matricula);
                
                String semestre = resultadoDeConsulta.getString("Semestre");
                alumnoEncontrado.establecerSemestre(semestre);
                
                String correo = resultadoDeConsulta.getString("Correo");
                alumnoEncontrado.establecerCorreo(correo);
                
                String licenciatura = resultadoDeConsulta.getString("Licenciatura");
                alumnoEncontrado.establecerLicenciatura(licenciatura);
                
                alumnosEncontrados.add(alumnoEncontrado);
            }
        } catch (SQLException log) {
            GestorMensajes administradorMensajes = new GestorMensajes();
            administradorMensajes.mensajeError(log, "alumno");
        } finally{
            terminarConexionBD();
        }
        return alumnosEncontrados;
    }
    
    /**
     * Inicia una conexion con la base de datos
     */
    private void iniciarConexionBD(){
        GestorConexionBD conexionBD;
        conexionBD = GestorConexionBD.obtenerPermisosAdministradorConexion();
        constructorInstruccionesMySQL = conexionBD.abrirConexionBD();
    }
    
    /**
     * actualiza la informacion del alumno en la base de datos
     * @param _alumno 
     */
    private void actualizarAlumno(Alumno _alumno){
        AlumnosMySQL alumnosMySQL = new AlumnosMySQL();
        String instruccionMySQL = alumnosMySQL.modificacion(_alumno);
        GestorMensajes administradorMensajes = new GestorMensajes();
        try {
            constructorInstruccionesMySQL.executeUpdate(instruccionMySQL);
            administradorMensajes.mensaje("Actualizacion de alumno Exitosa");
        } catch (SQLException log){
            administradorMensajes.mensajeError(log, "Actualizacion Alumno");
        }finally{
            terminarConexionBD();
        }
    }
    
    /**
     *  Inicializa las variables y componentes que pueda contener la clase
     */
    private void iniciarComponentes(){
        constructorInstruccionesMySQL = null;
    }

    /**
     * Registra al alumno en la base de datos
     * @param _instruccionMySQL
     * @throws SQLException 
     */
    private void registrarAlumnoBD(Alumno _nuevoAlumno){
        AlumnosMySQL alumnosMySQL = new AlumnosMySQL();
        String instruccionMySQL = alumnosMySQL.registro(_nuevoAlumno);
        GestorMensajes administradorMensajes = new GestorMensajes();
        
        try {
            constructorInstruccionesMySQL.executeUpdate(instruccionMySQL);
            administradorMensajes.mensaje("Alta de alumno Exitosa");
        } catch (SQLException log){
            administradorMensajes.mensajeError(log, "Registro Alumno");
        }finally{
            terminarConexionBD();
        }
    }
    
    /**
     * termina la conexion con la base de datos
     */
    private void terminarConexionBD(){
        GestorConexionBD conexionBD;
        conexionBD = GestorConexionBD.obtenerPermisosAdministradorConexion();
        conexionBD.cerrarConexionBD();
    }
    
////////////////////////////////////////////////////////////////////////////////
// Declaracion de Variables
////////////////////////////////////////////////////////////////////////////////
    private Statement constructorInstruccionesMySQL;
}